﻿Imports Microsoft.DirectX.Direct3D
Imports Commander_Wars.Spieletools
Public Class GebaeudeOmega_Rakete
    Inherits ObjektGebaeude
    Const Erweiterungskosten As Integer = 10000
    Public Sub New(ByVal neuSpieler As Integer, ByVal neuX As Integer, ByVal neuY As Integer, ByVal Spielfeld As ObjektSpielfeld)
        MyBase.New("OMEGARAKETE", neuSpieler, neuX, neuY, ObjektSpielfeld.Bodenschlacht)
        GebaeudeLaden()
        getBildID(Spielfeld)
    End Sub
    Public Sub New(ByVal neuSpieler As Integer, ByVal neuLeben As Integer, ByVal neuBesetzungszahl As Integer, ByVal neuX As Integer, ByVal neuY As Integer, ByVal Feuerzahl As Integer, ByVal Spielfeld As ObjektSpielfeld)
        MyBase.New("OMEGARAKETE", neuSpieler, neuLeben, neuBesetzungszahl, neuX, neuY, Feuerzahl, ObjektSpielfeld.Bodenschlacht)
        GebaeudeLaden()
        getBildID(Spielfeld)
    End Sub

    Public Sub New()
        MyBase.New("", -1, -1, -1, ObjektSpielfeld.Bodenschlacht)
        Gebaeudename = "Omega-Rakete"
        getFonds = False
        Deckung = 0
        Bestzunge = -1
        Schaden = 8
        Reichweite = 5
        Rechteck.Height = Hauptmenue.Feldbreite * 4
        Rechteck.Width = Hauptmenue.Feldbreite * 4
        Angriff = Angriffe.Rakete
        If Spieler = 0 Then
            Leben = -1
        Else
            Select Case DataSettings.CommanderWarsGameModus
                Case CommanderWarsGameModi.CommanderWars2, CommanderWarsGameModi.CommanderWars
                    Leben = 2000
                Case Else
                    Leben = -1
            End Select
        End If
        Feuerbereite = 1
        Feuerladung = 1
        RotationsZenturm = New Point(Hauptmenue.Feldbreite * 3 / 2, Hauptmenue.Feldbreite * 5 / 2)
        WirdZu = "EBENE+SCHROTT"
        Variablen = New Variable() {New Variable("Raketenantrieb", 1), New Variable("Raketenrumpf", 1), New Variable("Sprengstoffkapsel", 1), New Variable("Sprengstoff", 1), New Variable("Zielsuchsystem", 1)}
        Verweisgebaeude = New Integer(,) {{-1, -2}, {0, -2}, {1, -2}, {2, -2}, {-1, -1}, {0, -1}, {1, -1}, {2, -1}, {-1, 0}, {1, 0}, {2, 0}, {-1, 1}, {0, 1}, {1, 1}, {2, 1}}
    End Sub

    Private Sub GebaeudeLaden()
        Gebaeudename = "Omega-Rakete"
        getFonds = False
        Deckung = 0
        Bestzunge = -1
        Schaden = 8
        Reichweite = 5
        Rechteck.Height = Hauptmenue.Feldbreite * 4
        Rechteck.Width = Hauptmenue.Feldbreite * 4
        Angriff = Angriffe.Rakete
        If Spieler = 0 Then
            Leben = -1
        Else
            Select Case DataSettings.CommanderWarsGameModus
                Case CommanderWarsGameModi.CommanderWars2, CommanderWarsGameModi.CommanderWars
                    Leben = 2000
                Case Else
                    Leben = -1
            End Select
        End If
        Feuerbereite = 1
        Feuerladung = 1
        RotationsZenturm = New Point(Hauptmenue.Feldbreite * 3 / 2, Hauptmenue.Feldbreite * 5 / 2)
        WirdZu = "EBENE+SCHROTT"
        Variablen = New Variable() {New Variable("Raketenantrieb", 1), New Variable("Raketenrumpf", 1), New Variable("Sprengstoffkapsel", 1), New Variable("Sprengstoff", 1), New Variable("Zielsuchsystem", 1)}
        Verweisgebaeude = New Integer(,) {{-1, -2}, {0, -2}, {1, -2}, {2, -2}, {-1, -1}, {0, -1}, {1, -1}, {2, -1}, {-1, 0}, {1, 0}, {2, 0}, {-1, 1}, {0, 1}, {1, 1}, {2, 1}}
        If Not Objektverwalter.Spielfeld Is Nothing Then
            If Rechteck.X > 0 And Rechteck.Y > 1 And Rechteck.X < Objektverwalter.Spielfeld.Breite - 2 And Rechteck.Y < Objektverwalter.Spielfeld.Hoehe - 1 Then
                For I = 0 To Verweisgebaeude.GetLength(0) - 1
                    Dim b As Integer = Objektverwalter.Spielfeld.Landschaften.GetLength(0)
                    Objektverwalter.Spielfeld.Landschaften(Rechteck.X + Verweisgebaeude(I, 0), Rechteck.Y + Verweisgebaeude(I, 1), ObjektSpielfeld.Bodenschlacht).Gebaeude = New GebaeudeVerweis(Spieler, Rechteck.X, Rechteck.Y, ObjektSpielfeld.Bodenschlacht)
                Next
            End If
        End If
    End Sub
    Public Overrides Function GetMaxLeben() As Integer
        Select Case DataSettings.CommanderWarsGameModus
            Case CommanderWarsGameModi.CommanderWars2, CommanderWarsGameModi.CommanderWars
                If Leben > 2000 Then Return Leben
                Return 2000
            Case Else
                If Leben > -1 Then Return Leben
                Return -1
        End Select
    End Function
    Public Overrides Sub Feuer(ByVal X As Integer, ByVal Y As Integer)
        Dim Feuerbereit As Boolean = True
        Dim NichtGekaufteErweiterungen As String() = {}
        Dim Symbole() As Texture = {}

        For I = 0 To Variablen.Length - 1
            If Variablen(I).Wert = 1 Then
                Feuerbereit = False
                If Objektverwalter.Spielfeld.AktuellerSpieler.Fonds >= Erweiterungskosten Then
                    Array.Resize(NichtGekaufteErweiterungen, NichtGekaufteErweiterungen.Length + 1)
                    Array.Resize(Symbole, Symbole.Length + 1)
                    NichtGekaufteErweiterungen(NichtGekaufteErweiterungen.Length - 1) = Variablen(I).Name
                    Symbole(Symbole.Length - 1) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Omega-Bau.png")
                    Feuerbereit = False
                Else
                    Feuerbereit = False
                End If
            End If
        Next
        If NichtGekaufteErweiterungen.Length = 0 Then
            If Feuerbereit = True Then
                If (DataSettings._2D_3D_Malen Or DataSettings.draw3D) Then
                    Objektverwalter.EinheitenMenue = New ObjektEinheitenmenue(New String() {"Omega-Rakete Zuenden"}, New Texture() {Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png")}, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes)
                Else
                    Objektverwalter.EinheitenMenue = New ObjektEinheitenmenue(New String() {"Omega-Rakete Zuenden"}, New Texture() {Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\Feuer.png")}, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, X * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, Y * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes)
                End If
            Else
                Dim M As ObjektSpielMenue = Objektverwalter.Menue
                M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
            End If
        Else
            If (DataSettings.draw3D Or DataSettings._2D_3D_Malen) Then
                Objektverwalter.EinheitenMenue = New ObjektEinheitenmenue(NichtGekaufteErweiterungen, Symbole, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes)
            Else
                Objektverwalter.EinheitenMenue = New ObjektEinheitenmenue(NichtGekaufteErweiterungen, Symbole, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, X * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, Y * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes)
            End If
        End If
    End Sub
    Public Overrides Sub FeuerradiusAnzeigen()
        'Do Nothing
    End Sub
    Public Overrides Sub DOSpielFrame()
        Feuerbereit = 1
    End Sub
    Public Overrides Function GetLandschaftsuntergrund() As String()
        Return New String() {"EBENE", "SCHNEE", "WUESTE", "EBENE+SCHROTT"}
    End Function
    Public Sub ErweiterungKaufen(ByVal Name As String)
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Buy a part of a Omega-Rocket.")
        End If
        For I = 0 To Variablen.Length - 1
            If Variablen(I).Name = Name Then

                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                    Dim Befehl As New KINetzwerkBefehl
                    Befehl.Befehl = ObjektKI.KIModiExtern.OmegaUpgradeKaufen
                    Befehl.KooX = Rechteck.X
                    Befehl.KooY = Rechteck.Y
                    Befehl.WegX = New Integer() {Rechteck.X}
                    Befehl.WegY = New Integer() {Rechteck.Y}
                    Befehl.OpferX = I
                    Befehl.OpferY = -1
                    Befehl.AngreiferSchaden = -1
                    Befehl.Verteidigerschaden = -1
                    Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                    Hauptmenue.NetzBefehlSenden(Befehl)
                End If

                Variablen(I).Wert = 0
                Objektverwalter.Spielfeld.AktuellerSpieler.Fonds = -Erweiterungskosten
                Feuerbereit = -1
            End If
        Next
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
    End Sub
    ''' <summary>
    ''' Feuert die Omega-Rakete auf das angegebene Ziel und Wumms
    ''' </summary>
    ''' <param name="X1"></param>
    ''' <param name="Y1"></param>
    ''' <remarks></remarks>
    Public Sub RaketeStarten(ByVal X1 As Integer, ByVal Y1 As Integer)
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Launch Omega-Rocket.")
        End If
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.OmegaRaketeStarten
            Befehl.KooX = Rechteck.X
            Befehl.KooY = Rechteck.Y
            Befehl.WegX = New Integer() {Rechteck.X}
            Befehl.WegY = New Integer() {Rechteck.Y}
            Befehl.OpferX = X1
            Befehl.OpferY = Y1
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        For I = 0 To Variablen.Length - 1
            Variablen(I).Wert = 1
        Next
        Feuerbereit = -1
        Dim Kreis As Integer(,) = Kreisfunktion(Reichweite)
        For X = -Reichweite To Reichweite - 1
            For Y = -Reichweite To Reichweite - 1
                If Kreis(X + Reichweite, Y + Reichweite) >= 0 Then
                    DoDamage(X + X1, Y + Y1)
                End If
            Next
        Next
        'So jetzt muss da nur noch die Raketenanimation abgespielt werden
        'Fuer den Anfang werden lauter einzel Explosionen gemalt
        ObjektLadeklasse.SiloExplosion(Reichweite, "LAND", X1, Y1, ObjektSpielfeld.Bodenschlacht)
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
    End Sub
    ''' <summary>
    ''' Findet heraus ob alle Upgrades gekauft wurden.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function RaketeFeuerbereit() As Boolean
        For I = 0 To Variablen.Length - 1
            If Variablen(I).Wert = 1 Then
                Return False
            End If
        Next
        Return True
    End Function
    ''' <summary>
    ''' Gibt das erste Upgrade zurueck, welches nicht gekauft wurde!
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetErstesNichtGekauftesUpgrade() As Integer
        For I = 0 To Variablen.Length - 1
            If Variablen(I).Wert = 1 Then
                Return I
            End If
        Next
    End Function
    Public Overrides Function GetAngriffsFelder() As System.Drawing.Point()
        Return New Point() {}
    End Function
End Class
